package br.com.gkarian.mydesk.model.financeiro;

import java.util.Calendar;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;

import br.com.gkarian.mydesk.formatter.DateFormatter;
import br.com.gkarian.mydesk.model.Usuario;

@Entity
public class Transacao {

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	@Length(min=1, max=8, message="transacao.valor.tamanho")
	@Column(length=8)
	private String valor;
	
	@Max(value=200, message="transacao.descricao.tamanho")
	@Column(length=200)
	private String descricao;
	
	@Column
	private boolean entrada;
	
	@NotNull(message="transacao.datatransacao.vazio")
	@Temporal(TemporalType.DATE)
	@DateTimeFormat(pattern="dd/MM/yyyy")
	@Column(length=10)
	private Calendar dataTransacao;
	
	@Temporal(TemporalType.DATE)
	@DateTimeFormat(pattern="dd/MM/yyyy")
	@Column(length=10)
	private Calendar dataReferencia;
	
	@OneToOne
	private TipoTransacao tipoTransacao;
	
	@ManyToOne(fetch=FetchType.EAGER)
	@Fetch(FetchMode.JOIN)
	private ContaBancaria contaBancaria;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@Fetch(FetchMode.JOIN)
	private Usuario usuario;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getValor() {
		return valor;
	}

	public void setValor(String valor) {
		this.valor = valor;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public boolean isEntrada() {
		return entrada;
	}

	public void setEntrada(boolean entrada) {
		this.entrada = entrada;
	}

	public Calendar getDataReferencia() {
		return dataReferencia;
	}

	public void setDataReferencia(Calendar dataReferencia) {
		this.dataReferencia = dataReferencia;
	}

	public TipoTransacao getTipoTransacao() {
		return tipoTransacao;
	}

	public void setTipoTransacao(TipoTransacao tipoTransacao) {
		this.tipoTransacao = tipoTransacao;
	}

	public ContaBancaria getContaBancaria() {
		return contaBancaria;
	}

	public void setContaBancaria(ContaBancaria contaBancaria) {
		this.contaBancaria = contaBancaria;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	public Calendar getDataTransacao() {
		return dataTransacao;
	}
	
	public void setDataTransacao(Calendar dataTransacao) {
		this.dataTransacao = dataTransacao;
	}

	@Override
	public String toString() {
		return "Transacao [id=" + id + ", valor=" + valor + ", descricao="
				+ descricao + ", entrada=" + entrada + 
				", dataTransacao=" + DateFormatter.dateFormatter(dataTransacao, DateFormatter.DD_MM_YYYY) + 
				", dataReferencia=" + DateFormatter.dateFormatter(dataReferencia, DateFormatter.DD_MM_YYYY)
				+ ", tipoTransacao=" + tipoTransacao + ", contaBancaria="
				+ contaBancaria + ", usuario=" + usuario + "]";
	}

	
}
